package de.hska.swlab.iwwdnw;

import java.util.Observable;
import java.util.Observer;

import de.hska.swlab.iwwdnw.gui.GuiAnderenWissenzeigerWaehlen;
import de.hska.swlab.iwwdnw.gui.GuiAntwortFalsch;
import de.hska.swlab.iwwdnw.gui.GuiAntwortGeben;
import de.hska.swlab.iwwdnw.gui.GuiAntwortRichtig;
import de.hska.swlab.iwwdnw.gui.GuiAnzahlSpielerFestlegen;
import de.hska.swlab.iwwdnw.gui.GuiBeginnerErmitteln;
import de.hska.swlab.iwwdnw.gui.GuiController;
import de.hska.swlab.iwwdnw.gui.GuiKategorieFuerFrageWaehlen;
import de.hska.swlab.iwwdnw.gui.GuiKategorieWaehlen;
import de.hska.swlab.iwwdnw.gui.GuiNamenSetzen;
import de.hska.swlab.iwwdnw.gui.GuiSpielStarten;
import de.hska.swlab.iwwdnw.gui.GuiSpielVorbei;
import de.hska.swlab.iwwdnw.gui.GuiSpielerHatGewuerfelt;
import de.hska.swlab.iwwdnw.gui.GuiWissensstreiterBewegen;
import de.hska.swlab.iwwdnw.gui.GuiZeigeSpielfeld;
import de.hska.swlab.iwwdnw.model.IWWWDNW;
import de.hska.swlab.iwwdnw.model.Status;

/**
 * Verantwortlich fuer das Entgegennemen von Modell-Events ({@link Status})
 * und das Weiterdelegieren der abzuarbeiteten Logik an einen passenden
 * {@link GuiController}.
 */
public class Gui implements Observer {

	/**
	 * Das Spielmodell.
	 */
	private IWWWDNW spiel;
	
	/**
	 * Facade GUI executer / controller.
	 */
	private GuiController executer;

	
	public Gui(IWWWDNW spiel) {
		this.spiel = spiel;
		this.spiel.addObserver(this);
	}

	/**
	 * Event vom Modell entgegennehmen und den passenden {@link GuiController} waehlen.
	 */
	@Override
	public void update(Observable obs, Object param) {
		switch (spiel.getSpielStatus()) {
		case ANZAHL_SPIELER_FESTLEGEN:
			executer = new GuiAnzahlSpielerFestlegen();
			break;
		case NAMEN_SETZEN_1:
		case NAMEN_SETZEN_2:
		case NAMEN_SETZEN_3:
		case NAMEN_SETZEN_4:
			executer = new GuiNamenSetzen();
			break;
		case KATEGORIE_WAEHLEN_1:
		case KATEGORIE_WAEHLEN_2:
		case KATEGORIE_WAEHLEN_3:
		case KATEGORIE_WAEHLEN_4:
			executer = new GuiKategorieWaehlen();
			break;
		case BEGINNER_ERMITTELN:
			executer = new GuiBeginnerErmitteln();
			break;
			
		case SPIELERWURF:
			executer = new GuiSpielerHatGewuerfelt();
			break;
		case SPIEL_STARTEN:
			executer = new GuiSpielStarten();
			break;
		case ZEIGE_SPIELFELD:
			executer = new GuiZeigeSpielfeld();
			break;
		case WISSENSSTREITER_BEWEGEN:
			executer = new GuiWissensstreiterBewegen();
			break;
		case SPIEL_VORBEI:
			executer = new GuiSpielVorbei();
			break;
		case KATEGORIE_FUER_FRAGE_WAEHLEN:
			executer = new GuiKategorieFuerFrageWaehlen();
			break;
		case ANTWORTEN:
			executer = new GuiAntwortGeben();
			break;
		case GEGENANTWORTEN:
			break;
		case ANTWORT_RICHTIG:
			executer = new GuiAntwortRichtig();
			break;
		case ANTWORT_FALSCH:
			executer = new GuiAntwortFalsch();
			break;
		case ANDEREN_WISSENZEIGER_WAEHLEN:
			executer = new GuiAnderenWissenzeigerWaehlen();
			break;
		case GEGENANTWORT_ANDEREN_WISSENZEIGER_WAEHLEN:
			break;
		default:
			System.err.println("Nicht behandelter Status: " + spiel.getSpielStatus());
			break;
		}
		
		executer.execute(spiel);
	}
}
